From cb111972c4a3e458d8f593af45683587dd3a0f96 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 14 Jul 2005 08:00:23 +0000 Subject: [PATCH] Enable CR4.VME to improve the performance of vm86 emulation. Setting this bit eliminates the calls to the vm86 monitor to handle interrupts and exceptions that occur while executing programs in vm86 mode. Signed-off-by: Asit Mallick Signed-off-by: Arun Sharma --- tools/firmware/vmxassist/Makefile | 2 +- tools/firmware/vmxassist/machine.h | 8 ++++++-- tools/firmware/vmxassist/setup.c | 5 ++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tools/firmware/vmxassist/Makefile b/tools/firmware/vmxassist/Makefile index 17ef50b76b..e5560a9463 100644 --- a/tools/firmware/vmxassist/Makefile +++ b/tools/firmware/vmxassist/Makefile @@ -24,7 +24,7 @@ include $(XEN_ROOT)/tools/Rules.mk # The emulator code lives in ROM space TEXTADDR=0x000D0000 -DEFINES=-DDEBUG -DTEXTADDR=${TEXTADDR} -D_ACPI_ +DEFINES=-DDEBUG -DENABLE_VME -DTEXTADDR=${TEXTADDR} XENINC=-I$(XEN_ROOT)/xen/include -I$(XEN_ROOT)/tools/libxc #DEFINES=-DDEBUG -DTEST -DTEXTADDR=${TEXTADDR} #XENINC=-I/home/leendert/xen/xeno-unstable.bk/xen/include diff --git a/tools/firmware/vmxassist/machine.h b/tools/firmware/vmxassist/machine.h index 5d448ef13b..fd5779af6f 100644 --- a/tools/firmware/vmxassist/machine.h +++ b/tools/firmware/vmxassist/machine.h @@ -40,7 +40,8 @@ #define EFLAGS_TF (1 << 8) #define EFLAGS_IF (1 << 9) #define EFLAGS_DF (1 << 10) -#define EFLAGS_VM (1 << 17) +#define EFLAGS_IOPL (3 << 12) +#define EFLAGS_VM ((1 << 17) | EFLAGS_IOPL) #define EFLAGS_VIF (1 << 19) #define EFLAGS_VIP (1 << 20) @@ -109,6 +110,9 @@ struct tss { unsigned short _5; unsigned short _6; unsigned short iomap_base; +#ifdef ENABLE_VME + unsigned long int_redir[8]; +#endif unsigned char iomap[8192]; }; @@ -177,7 +181,6 @@ get_cr4(void) return rv; } -#ifdef TEST static inline void set_cr3(unsigned addr) { @@ -190,6 +193,7 @@ set_cr4(unsigned value) __asm__ __volatile__("movl %0, %%cr4" : /* no outputs */ : "r"(value)); } +#ifdef TEST static inline void breakpoint(void) { diff --git a/tools/firmware/vmxassist/setup.c b/tools/firmware/vmxassist/setup.c index f572ae1698..19324d1d5c 100644 --- a/tools/firmware/vmxassist/setup.c +++ b/tools/firmware/vmxassist/setup.c @@ -121,7 +121,7 @@ void setup_gdt(void) { /* setup task state segment */ - memset(&tss, 0, sizeof(0)); + memset(&tss, 0, sizeof(tss)); tss.ss0 = DATA_SELECTOR; tss.esp0 = (unsigned) stack_top - 4*4; tss.iomap_base = offsetof(struct tss, iomap); @@ -353,6 +353,9 @@ main() #endif setup_gdt(); setup_idt(); +#ifdef ENABLE_VME + set_cr4(get_cr4() | CR4_VME); +#endif setup_ctx(); setup_pic(); start_bios(); -- 2.30.2